#ifndef NONLINEARITYBASE_H
#define NONLINEARITYBASE_H
#include "SimEngine/SISOModel.h"



// Przestrzeń nazw
namespace RafMat
{
namespace SimEngine
{

// Deklaracja zapowiadająca
class NonlinearityBase;

/** Alias na zręczny wskaźnik dla klasy NonlinearityBase */
typedef boost::shared_ptr<NonlinearityBase> NonlinearityBaseSPtr;

class NonlinearityBase : public SISOModel
{
public:
    /**

    */
    explicit NonlinearityBase(const SimInterface::ISimulator& simulator, std::string type);

    /**
        Realizuje pracę krokową obiektu reprezentującego nieliniowość.

        Implementacja metody z klasy bazowej SISOModel. Oblicza wyjście
        powstałe w wyniku nieliniowości.

        \param [in] sample Próbka sygnału wyjściowego z obiektu.
        \return Wyjście powstałe w wyniku nieliniowości.
    */
    double simulateStep(double sample);

    std::string getType() const { return m_type; }


    std::string getParameter(const std::string& param) const throw(std::logic_error);

    /**
        Wysyła stan obiektu do strumienia.

        \param [in/out] o strumień docelowy.
        \return Strumień przekazany funkcji.
    */
    virtual SimFile::ConfigWriter& dumpParameters(SimFile::ConfigWriter& o) const;

protected:

    /**
        Wykonuje krok symulacji dla nieliniowości i zwraca nowe wyjście.

        Metoda jest czysto wirtualna, implementacją zajmują się konkretne realizacje nieliniowości.

        \param [in] objectOutput Wartość wyjściowa obiektu
        \return Nowa wartość wyjścia obiektu poddanego nieliniowości.
    */
    virtual double simulateNonlinearityStep(double objectOutput) = 0;

    virtual SimFile::ConfigWriter& dumpSpecificPar(SimFile::ConfigWriter& o) const = 0;

private:
    static const std::string CONF_TYPE;

    std::string m_type;             ///< Typ nieliniowości.
};
}
}

#endif // NONLINEARITYBASE_H
